{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Optiland Torch Module - Custom Objective\n",
    "\n",
    "This notebook demonstrates a more advanced feature: defining a **custom objective function**. Instead of just minimizing RMS spot size, we'll create a composite objective that simultaneously minimizes the spot size and penalizes the total length of the optical system. This showcases the flexibility of combining Optiland with PyTorch for complex design goals."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "import optiland.backend as be\n",
    "from optiland import optic, optimization\n",
    "from optiland.ml import OpticalSystemModule\n",
    "from optiland.wavefront import ZernikeOPD\n",
    "\n",
    "be.set_backend(\"torch\")  # Set the backend to PyTorch\n",
    "be.grad_mode.enable()  # Enable gradient tracking"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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hQsztxPr0vrggw/k9NNPN/HU78EDDjhAXnjhhZJ+T5JYlaE333xTEomE3HPPPfLaa6/Jt771Lbn77rvla1/7WuY+XV1dcswxx8icOXPkxRdflFtuucX8D/rd737X032vRJqwnnLKKXL++ecXvT0ej5ukSu/37LPPyn333SerVq0y//NhbH784x/LsmXLzA8FL730khx00EFy7LHHyvbt273etYrX29tr4qmJazH6w8vtt99uPkuef/55aWhoMLHXL26MzTPPPGMOdp577jl54oknJBqNms9j/TdwXHrppfLwww/LT3/6U3P/zZs3y5e+9CVP97tSzZw50xzg63edHgR9/vOflxNPPNF8PypiPTF+//vfm+MQTWqzEe/S2m+//WTLli2Z0+9+97vMbcS6dDo6OuTwww+XcDhsfph5/fXX5V//9V+lra2ttN+T2m4d5e/mm29Ozps3L7P9b//2b8m2trbk4OBg5rorrrgiuWDBAo/2sPLde++9yZaWloLrH3vssWRVVVVy69atmevuuuuuZHNzc078sXuf+cxnkhdeeGFmOx6PJ2fMmJFcuXKlp/vlN/rR/sADD2S2E4lEctq0aclbbrklc11nZ2eypqYm+aMf/cijvfSP7du3m5g/88wzmdiGw+HkT3/608x93njjDXOfNWvWeLin/qHff9///veJ9QTp7u5O7rvvvsknnngi+f/+3/9LfvWrXzXXE+/Suuaaa5IHHXRQ0duIdWnpMfIRRxwx7O2l+p5kxKpC7Nq1S9rb2zPba9askb/4i7+Q6urqzHWaVWs5imblKB2NtQ4XT506NSfWOmro/GKK3dMRP/3FWYfWHVVVVWZbY4yJs2HDBtm6dWtO7FtaWkwpJrEvzeezcj6j9X2uo1jZ8dbyntmzZxPvcdIKgtWrV5vRQS0JJNYTQ0dktVIjO66KeJeelpppCff8+fPlH//xH83UA0WsS+uhhx6ST3/606ZCSUu4DznkEPne975X8u9JEqsKsH79ernjjjvk3HPPzVyn//jZB/rK2dbbUDrEujR27NhhDoqKxZI4TiwnvsS+9LRsW+efaInJ/vvvb67TmOqPXvlzNon3nvvjH/9o5pjU1NTIeeedJw888IAsWrSIWE8ATVy1VFvnEuYj3qWlB+06teDxxx83cwn14F7nznd3dxPrEvvzn/9sYrzvvvvKL3/5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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens = optic.Optic()\n",
    "lens.add_surface(index=0, thickness=be.inf)\n",
    "lens.add_surface(index=1, thickness=7, radius=200, material=\"N-SF11\", is_stop=True)\n",
    "lens.add_surface(index=2, thickness=50, radius=-200)\n",
    "lens.add_surface(index=3)\n",
    "lens.set_aperture(aperture_type=\"EPD\", value=20)\n",
    "lens.set_field_type(field_type=\"angle\")\n",
    "lens.add_field(y=0.0)\n",
    "lens.add_wavelength(value=0.55, is_primary=True)\n",
    "_ = lens.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build optimization problem\n",
    "\n",
    "First, we set up the standard optimization problem. We'll define the RMS spot size as our primary operand and the lens radii as variables. The custom objective will build upon this foundation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "problem = optimization.OptimizationProblem()\n",
    "input_data = {\n",
    "    \"optic\": lens,\n",
    "    \"surface_number\": -1,\n",
    "    \"Hx\": 0, \"Hy\": 0,\n",
    "    \"num_rays\": 7,\n",
    "    \"wavelength\": 0.55,\n",
    "    \"distribution\": \"hexapolar\",\n",
    "}\n",
    "problem.add_operand(\"rms_spot_size\", target=0, weight=1, input_data=input_data)\n",
    "problem.add_variable(lens, \"radius\", surface_number=1)\n",
    "problem.add_variable(lens, \"radius\", surface_number=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a Custom Objective Function\n",
    "\n",
    "This is the core of this example. We create a Python function that returns our desired loss value. This function can perform any calculation using the underlying Optiland objects. Our objective will be:\n",
    "\n",
    "$$ \\text{Loss} = (\\text{RMS Spot Size})^2 + \\lambda \\cdot (\\text{Total System Length}) $$\n",
    "\n",
    "where $\\lambda$ is a weighting factor to balance the two terms."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def custom_objective():\n",
    "    \"\"\"\n",
    "    Custom objective that minimizes both RMS spot size and total system length.\n",
    "    \"\"\"\n",
    "    # Calculate the sum of squared errors from the optimization problem (our spot size term)\n",
    "    spot_size_term = problem.sum_squared()\n",
    "    \n",
    "    # Add a penalty term proportional to the total length (total_track) of the lens\n",
    "    # The 1e-3 factor balances the magnitude of the two terms in the loss function.\n",
    "    length_penalty = 1e-3 * lens.total_track\n",
    "    \n",
    "    return spot_size_term + length_penalty"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define PyTorch module in Optiland\n",
    "\n",
    "We now pass our custom function to the `OpticalSystemModule` using the `objective_fn` argument. The module will call this function during its forward pass to compute the loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = OpticalSystemModule(lens, problem, objective_fn=custom_objective)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define PyTorch Adam Optimizer and pass model parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = torch.optim.Adam(model.parameters(), lr=0.3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimize with PyTorch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "losses = []\n",
    "\n",
    "for step in range(100):\n",
    "    optimizer.zero_grad()         # Clear gradients\n",
    "    loss = model()                # Forward pass computes RMS spot size\n",
    "    loss.backward()               # Backward pass computes gradients\n",
    "    optimizer.step()              # Update model parameters\n",
    "    model.apply_bounds()          # Apply parameter bounds\n",
    "    losses.append(loss.item())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "_ = lens.draw(num_rays=10)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "optiland (3.13.2)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
